package cn.mini.mybatis.mybatis.mapping;


/**
 * MapperStatement 用于保存 SQL 相关信息。
 */
public class MappedStatement {
    /**
     * SQL 语句的唯一标识，通常为 "命名空间.id" 的形式
     */
    private String id;
    /**
     * SQL 语句
     */
    private String sql;
    /**
     * SQL 语句的类型，如 SELECT、INSERT、UPDATE、DELETE
     */
    private SqlCommandType sqlCommandType;


    MappedStatement() {
        // constructor disabled
    }


    /**
     * 内部静态类，用于构建 MappedStatement 对象，采用建造者模式。
     * 该模式允许分步设置 MappedStatement 对象的属性，最后统一构建出完整的对象。
     */
    public static class Builder {
        // 持有一个 MappedStatement 对象，用于后续设置属性并构建最终对象
        private final MappedStatement mappedStatement = new MappedStatement();

        /**
         * 构造方法，初始化 MappedStatement 对象的基本属性。
         *
         * @param id             SQL 语句的唯一标识，通常为 "命名空间.id" 的形式
         * @param sqlCommandType SQL 语句的类型，如 SELECT、INSERT、UPDATE、DELETE
         * @param sql            具体的 SQL 语句
         */
        public Builder(String id,
                       SqlCommandType sqlCommandType,
                       String sql) {
            // 设置 SQL 语句的唯一标识
            mappedStatement.id = id;
            // 设置 SQL 语句的类型
            mappedStatement.sqlCommandType = sqlCommandType;
            // 设置具体的 SQL 语句
            mappedStatement.sql = sql;
        }

        /**
         * 构建 MappedStatement 对象。
         * 在构建前会断言 SQL 语句的唯一标识不为空，确保对象的完整性。
         *
         * @return 构建好的 MappedStatement 对象
         */
        public MappedStatement build() {
            // 断言 SQL 语句的唯一标识不为空，若为空则抛出 AssertionError
            assert mappedStatement.id != null;
            // 返回构建好的 MappedStatement 对象
            return mappedStatement;
        }
    }


    /**
     * 获取 SQL 语句的唯一标识
     * @return SQL 语句的唯一标识
     */
    public String getId() {
        return id;
    }

    /**
     * 获取 SQL 语句
     * @return SQL 语句
     */
    public String getSql() {
        return sql;
    }

    /**
     * 获取 SQL 语句的类型
     * @return SQL 语句的类型
     */
    public SqlCommandType getSqlCommandType() {
        return sqlCommandType;
    }



}